package com.longcai.cm.common.utils;

import com.longcai.cm.bean.CodeMakerBean;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Locale;
import java.util.Map;

/**
 *
 */
public class Freemarker {


    /**
     * 返回模板数据
     *
     * @param ftlName     ftl文件名
     * @param root        传入的map
     * @param outFile     输出后的文件全部路径
     * @param contextPath 输出前的文件上部路径
     * @throws Exception
     */
    public static String printTemplate(String ftlName, Map<String, Object> root, String contextPath) {
        StringWriter stringWriter = new StringWriter();
        Template template = null;
        try {
            Configuration cfg = new Configuration();//通过Freemaker的Configuration读取相应的ftl
            cfg.setEncoding(Locale.CHINA, "utf-8");
            cfg.setDirectoryForTemplateLoading(new File(contextPath + "/templates/base-ftl/"));//设定去哪里读取相应的ftl模板文件
            template = cfg.getTemplate(ftlName);//在模板文件目录中找到名称为name的文件

            //执行
            try {
                template.process(root, stringWriter);
            } catch (TemplateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return stringWriter.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "";
    }


    /**
     * 打印到控制台(测试用)
     *
     * @param ftlName
     */
    public static void print(String ftlName, Map<String, Object> root, String ftlPath) throws Exception {
        try {
            Template temp = getTemplate(ftlName, ftlPath);        //通过Template可以将模板文件输出到相应的流
            temp.process(root, new PrintWriter(System.out));
        } catch (TemplateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 输出到输出到文件
     *
     * @param ftlName     ftl文件名
     * @param root        传入的map
     * @param outFile     输出后的文件全部路径
     * @param contextPath 输出前的文件上部路径
     * @throws Exception
     */
    public static void printFile(String ftlName, Map<String, Object> root, String outFile, String contextPath) throws Exception {
        try {
            File file = new File(outFile);
            if (!file.getParentFile().exists()) {                //判断有没有父路径，就是判断文件整个路径是否存在
                file.getParentFile().mkdirs();                //不存在就全部创建
            }
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8));
            Template template = getTemplate(contextPath, ftlName);
            template.process(root, out);                    //模版输出
            out.flush();
            out.close();
        } catch (TemplateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 输出到输出到文件
     *
     * @param ftlName     ftl文件名
     * @param root        传入的map
     * @param outFile     输出后的文件全部路径
     * @param contextPath 输出前的文件上部路径
     */
    public static void printFile(String ftlName, CodeMakerBean cmb, String outFile, String contextPath) throws Exception {
        try {
            File file = new File(outFile);
            if (!file.getParentFile().exists()) {                //判断有没有父路径，就是判断文件整个路径是否存在
                file.getParentFile().mkdirs();                //不存在就全部创建
            }
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8"));
            Template template = getTemplate(contextPath, ftlName);
            template.process(cmb, out);                    //模版输出
            out.flush();
            out.close();
        } catch (TemplateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 输出字符串到输出到文件
     *
     * @param ftlName     ftl文件名
     * @param root        传入的map
     * @param outFile     输出后的文件全部路径
     * @param contextPath 输出前的文件上部路径
     */
    public static void printContentString(String templateContent, Map<String, Object> root, String outFile, String contextPath) throws Exception {
        try {
            File file = new File(outFile);
            if (!file.getParentFile().exists()) {                //判断有没有父路径，就是判断文件整个路径是否存在
                file.getParentFile().mkdirs();                //不存在就全部创建
            }
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8"));

//			Template template = getTemplate(contextPath,ftlName);

            Configuration cfg = new Configuration();
            StringTemplateLoader stringLoader = new StringTemplateLoader();
            stringLoader.putTemplate("myTemplate", templateContent);
            cfg.setTemplateLoader(stringLoader);
            Template template = cfg.getTemplate("myTemplate", "utf-8");

            template.process(root, out);                    //模版输出
            out.flush();
            out.close();
        } catch (TemplateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 通过文件名加载模版
     *
     * @param ftlName
     */
    @SuppressWarnings("deprecation")
    public static Template getTemplate(String contextPath, String ftlName) throws Exception {

        try {
            Configuration cfg = new Configuration();//通过Freemaker的Configuration读取相应的ftl
            cfg.setEncoding(Locale.CHINA, "utf-8");
            cfg.setDirectoryForTemplateLoading(new File(contextPath + "/templates/base-ftl/"));//设定去哪里读取相应的ftl模板文件
            Template temp = cfg.getTemplate(ftlName);//在模板文件目录中找到名称为name的文件
            return temp;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
